#!/bin/bash
LOG_DIR="logs/docker-build"
mkdir -p "$LOG_DIR"

# ============================================================
# 多模块并行构建 + 自动版本号 + version.properties
# 支持外部 VERSION 环境变量（CI 自动注入）
# ============================================================

ROOT_DIR=$(pwd)
MODULE_ROOT="webapps"
DOCKERFILE="Dockerfile"
IMAGE_PREFIX="elsfs"

PARALLEL=4

# ============================================================
# 1. 自动获取 VERSION（支持外部传入）
# ============================================================

if [ -z "$VERSION" ]; then
  echo "未检测到 VERSION 环境变量，使用自动生成版本号..."

  GIT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
  GIT_SHA=$(git rev-parse --short HEAD)
  BUILD_TIME=$(date +"%Y%m%d-%H%M%S")

  VERSION="${GIT_TAG}-${BUILD_TIME}-g${GIT_SHA}"
else
  echo "使用外部传入的 VERSION: $VERSION"
fi

echo "最终构建版本号：$VERSION"


# ============================================================
# 2. 参数解析（-j 并行数 或 指定模块）
# ============================================================
CUSTOM_MODULES=()

while [[ $# -gt 0 ]]; do
  case $1 in
    -j|--jobs)
      PARALLEL=$2
      shift 2
      ;;
    *)
      CUSTOM_MODULES+=("$1")
      shift
      ;;
  esac
done


# ============================================================
# 3. 扫描模块（只匹配 *-application，格式 MODULE_ROOT:模块名）
# ============================================================
MODULES=()

if [ ${#CUSTOM_MODULES[@]} -gt 0 ]; then
  for m in "${CUSTOM_MODULES[@]}"; do
    MODULES+=("${MODULE_ROOT}:${m}")
  done
else
  # 扫描所有以 *-application 结尾的目录
  for dir in ${MODULE_ROOT}/*-application/; do
    [ -d "$dir" ] || continue
    MODULE_NAME=$(basename "$dir")
    MODULES+=("${MODULE_ROOT}:${MODULE_NAME}")
  done
fi



# ============================================================
# 工具函数
# ============================================================
green(){
  echo -e "\033[32m$1\033[0m";
}
red(){
  echo -e "\033[31m$1\033[0m";
}
yellow(){
  echo -e "\033[33m$1\033[0m";
}

# ============================================================
# 4. 构建单个模块
# ============================================================
build_module() {
  MODULE_PATH=$1
  MODULE_NAME=$(basename "$MODULE_PATH")
  IMAGE="${IMAGE_PREFIX}-${MODULE_NAME}:${VERSION}"
  LOG_FILE="${LOG_DIR}/build-${MODULE_NAME}.log"

  echo "[$(date '+%H:%M:%S')] 🚀 Start build: ${MODULE_NAME}"

  docker build \
    --build-arg MODULE=${MODULE_PATH%/} \
    -t ${IMAGE} \
    -f ${DOCKERFILE} \
    . > "$LOG_FILE" 2>&1

  if [ $? -eq 0 ]; then
    echo "SUCCESS:${MODULE_NAME}:${IMAGE}" >> build-status.txt
    green "✅ ${MODULE_NAME} build success (${IMAGE})"
  else
    echo "FAIL:${MODULE_NAME}" >> build-status.txt
    red "❌ ${MODULE_NAME} build failed (see ${LOG_FILE})"
  fi
}


# ============================================================
# 5. 并行调度器
# ============================================================
run_parallel() {
  JOBS=0
  > build-status.txt

  for MODULE in "${MODULES[@]}"; do
    build_module "$MODULE" &

    JOBS=$((JOBS + 1))
    if [ $JOBS -ge $PARALLEL ]; then
      wait -n
      JOBS=$((JOBS - 1))
    fi
  done

  wait
}


# ============================================================
# 6. 主流程执行
# ============================================================
green "==============================================="
green "🚀 多模块并行构建开始"
green "🧵 并行度: ${PARALLEL}"
green "🏷️ VERSION: ${VERSION}"
green "==============================================="

run_parallel


# ============================================================
# 7. 写入 version.properties
# ============================================================
green "📄 生成 version.properties"

> version.properties

while read line; do
  STATUS=$(echo $line | cut -d ":" -f1)
  NAME=$(echo $line | cut -d ":" -f2)
  IMAGE=$(echo $line | cut -d ":" -f3-)

  if [ "$STATUS" == "SUCCESS" ]; then
    echo "${NAME}=${IMAGE}" >> version.properties
  fi
done < build-status.txt

green "✅ version.properties 内容如下："
cat version.properties

green "==============================================="
green "🎉 全部构建完成！（VERSION = ${VERSION}）"
green "==============================================="
